package com.hdu.controller;


import com.hdu.annotation.OptLog;
import com.hdu.dto.UserOnlineDTO;
import com.hdu.pojo.Result;
import com.hdu.service.IUserInfoService;
import com.hdu.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;

import static com.hdu.constant.OptTypeConst.UPDATE;

/**
 * 用户信息控制器
 *
 * @author xiaobai
 * @since 2024-05-20
 */
@Slf4j
@RestController
@RequiredArgsConstructor
@Api(tags = "用户信息模块")
public class UserInfoController {

    private final IUserInfoService userInfoService;

    /**
     * 查询用户信息
     *
     * @return {@link Result <>}
     */
    @ApiOperation(value = "查询用户信息")
    @GetMapping("/users/info")
    public Result<?> getUserInfo() {
        return Result.success(userInfoService.getUserInfo());
    }

    /**
     * 更新用户信息
     *
     * @param userInfoVO 用户信息
     * @return {@link Result <>}
     */
    @ApiOperation(value = "更新用户信息")
    @PutMapping("/users/info")
    public Result<?> updateUserInfo(@Valid @RequestBody UserInfoVO userInfoVO) {
        log.info("更新用户基本信息 : {}", userInfoVO);
        userInfoService.updateUserInfo(userInfoVO);
        return Result.success();
    }

    /**
     * 更新用户头像
     *
     * @param avatar 头像
     * @return {@link Result<String>} 头像地址
     */
    @ApiOperation(value = "更新用户头像")
    @ApiImplicitParam(name = "avatar", value = "用户头像", required = true, dataType = "MultipartFile")
    @PostMapping("/users/avatar")
    public Result<String> updateUserAvatar(MultipartFile avatar, String tag) {
        return Result.success(userInfoService.updateUserAvatar(avatar, tag));
    }

    /**
     * 绑定用户邮箱
     *
     * @param emailVO 邮箱信息
     * @return {@link Result<>}
     */
    @ApiOperation(value = "绑定用户邮箱")
    @PostMapping("/users/email")
    public Result<?> saveUserEmail(@Valid @RequestBody EmailVO emailVO) {
        userInfoService.saveUserEmail(emailVO);
        return Result.success();
    }

    /**
     * 绑定用户手机
     *
     * @param phoneVO 手机信息
     * @return {@link Result<>}
     */
    @ApiOperation(value = "绑定用户邮箱")
    @PostMapping("/users/phone")
    public Result<?> saveUserEmail(@Valid @RequestBody PhoneVO phoneVO) {
        userInfoService.saveUserPhone(phoneVO);
        return Result.success();
    }

    /**
     * 修改用户角色
     *
     * @param userRoleVO 用户角色信息
     * @return {@link Result<>}
     */
    @OptLog(optType = UPDATE)
    @ApiOperation(value = "修改用户角色")
    @PutMapping("/admin/users/role")
    public Result<?> updateUserRole(@Valid @RequestBody UserRoleVO userRoleVO) {
        userInfoService.updateUserRole(userRoleVO);
        return Result.success();
    }

    /**
     * 修改用户禁用状态
     *
     * @param userDisableVO 用户禁用信息
     * @return {@link Result<>}
     */
    @OptLog(optType = UPDATE)
    @ApiOperation(value = "修改用户禁用状态")
    @PutMapping("/admin/users/disable")
    public Result<?> updateUserDisable(@Valid @RequestBody UserDisableVO userDisableVO) {
        userInfoService.updateUserDisable(userDisableVO);
        return Result.success();
    }

    /**
     * 查看在线用户
     *
     * @param conditionVO 条件
     * @return {@link Result<UserOnlineDTO>} 在线用户列表
     */
    @ApiOperation(value = "查看在线用户")
    @GetMapping("/admin/users/online")
    public Result<PageResult<UserOnlineDTO>> listOnlineUsers(ConditionVO conditionVO) {
        return Result.success(userInfoService.listOnlineUsers(conditionVO));
    }

    /**
     * 下线用户
     *
     * @param userInfoId 用户信息
     * @return {@link Result<>}
     */
    @ApiOperation(value = "下线用户")
    @DeleteMapping("/admin/users/{userInfoId}/online")
    public Result<?> removeOnlineUser(@PathVariable("userInfoId") Integer userInfoId) {
        userInfoService.removeOnlineUser(userInfoId);
        return Result.success();
    }

    @ApiOperation("发送验证码")
    @PostMapping("/sendVerifyCode")
    public Result<?> sendVerifyCode(String content) {
        log.info("验证码通知：{}", content);
        return Result.success();
    }

}

